#include "sock.h"
#ifdef  WIN32
#pragma comment(lib, "ws2_32.lib")
Sock Connect(char *ip,int port){
    if(0 == ip){
        return -1;
    }
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD(2,0);
    err = WSAStartup(wVersionRequested,&wsaData);//
    SOCKET ret = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//create  socket
    if(ret < 0){
        printf("error malloc socket%d\r\n",ret);
        exit(0);
    }
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = inet_addr(ip);//"49.152.49.84");
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(port);
    if(SOCKET_ERROR==connect(ret,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))){
        closesocket(ret);
        DWORD gle = WSAGetLastError();
        printf("connect socket error code %ld\r\n",gle);
        return -1;
    }
    return ret;
}

int Send(Sock s,char*dat, int len){
	fd_set wFds;
    FD_ZERO(&wFds);
    FD_SET(s,&wFds);

    int  ret = select(s + 1,0,&wFds,0,0);
    //  time expire
    if(ret == 0){
        return 0;
    }else  if(ret > 0){
        if(FD_ISSET(s,&wFds)){
            int  recv = send(s,dat,len,0);
            if(recv < 0)
            {
                closesocket(s);
                return   -2;
            }
            return  recv;
        }
    }else{
        printf("error code %d\r\n",ret);
        return  -1;
    }
}
int Recv(Sock s,char *rec,int len){
    fd_set rFds;
    fd_set eFds;
    FD_ZERO(&rFds);
    FD_SET(s,&rFds);

    int  ret = select(s + 1,&rFds,0,0,0);
    //  time expire
    if(ret == 0){
        return 0;
    }else  if(ret > 0){
        if(FD_ISSET(s,&rFds)){
            int recvDat = recv(s,rec,len,0);
            if(recvDat <0)
            {
                closesocket(s);
                return -1;
            }
            return recvDat;
        }
        if(FD_ISSET(s,&eFds)){
            closesocket(s);
            return   -3;
        }
    }
    return -1;
}

#endif


#ifdef linux
Sock Connect(char *ip,int port){
    if(0 == ip){
        return -1;
    }
    Sock ret = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//create  socket
    if(ret < 0){
        printf("error malloc socket%d\r\n",ret);
        exit(0);
    }
    struct sockaddr_in  addrSrv;
    addrSrv.sin_addr.s_addr = inet_addr(ip);//"49.152.49.84");
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(port);
    if(0 > connect(ret,(struct sockaddr*)&addrSrv,sizeof(struct sockaddr))){
        close(ret);
		
        printf("connect socket error code %ld\r\n",errno);
        return -1;
    }
    return ret;
}

int Recv(Sock s,char *rec,int len){
    fd_set rFds;
    fd_set eFds;
    FD_ZERO(&rFds);
    FD_SET(s,&rFds);

    int  ret = select(s + 1,&rFds,0,0,0);
    //  time expire
    if(ret == 0){
        return 0;
    }else  if(ret > 0){
        if(FD_ISSET(s,&rFds)){
            int recvDat = recv(s,rec,len,0);
            if(recvDat <0)
            {
                close(s);
                return -1;
            }
            return recvDat;
        }
        if(FD_ISSET(s,&eFds)){
            close(s);
            return   -3;
        }
    }
    return -1;
}
int CloseConn(Sock s){
	return close(s);
}

int Send(Sock s,char*dat, int len){
	fd_set wFds;
    FD_ZERO(&wFds);
    FD_SET(s,&wFds);

    int  ret = select(s + 1,0,&wFds,0,0);
    //  time expire
    if(ret == 0){
        return 0;
    }else  if(ret > 0){
        if(FD_ISSET(s,&wFds)){
            int  recv = send(s,dat,len,0);
            if(recv < 0)
            {
                CloseConn(s);
                return   -2;
            }
            return  recv;
        }
    }else{
        printf("error code %d\r\n",ret);
        return  -1;
    }
}


#endif




